// 给定一组非负整数，重新排列它们的顺序使之组成一个最大的整数。

// 示例 1:

// 输入: [10,2]
// 输出: 210
// 示例 2:

// 输入: [3,30,34,5,9]
// 输出: 9534330
// 说明: 输出结果可能非常大，所以你需要返回一个字符串而不是整数。

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

// 先转换成字符串，如果 ab 比 ba 大， 则 a 排在前面
class Solution {
public:
    string largestNumber(vector<int>& nums) {
        string res{};
        sort(nums.begin(), nums.end(), [](int a, int b) {
            return to_string(a) + to_string(b) > to_string(b) + to_string(a);
        });
        for (int i{0}; i < nums.size(); ++i) {
            res += to_string(nums[i]);
        }
        return res[0] == '0' ? "0" : res;
    }
};

class Solution {
public:
    string largestNumber(vector<int>& nums) {
        if (nums.empty()) {
            return "";
        }
        int n = nums.size();
        vector<string> strs(n, "");
        for (int i{0}; i < n; ++i) {
            strs[i] = to_string(nums[i]);
        }
        auto cmp = [] (const string& a, const string& b) {
            return a + b > b + a;
        };
        sort(strs.begin(), strs.end(), cmp);
        string result{""};
        for (const string& str : strs) {
            result += str;
        }
        return result[0] == '0' ? "0" : result;
    }
};